package portal.ejb;

import integracion.rest.entities.Ranking;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.apache.log4j.Logger;

import portal.converter.convVo;
import portal.entities.Producto;
import portal.entities.ProductoElectroDomestico;
import portal.entities.ProductoInfantil;
import portal.entities.ProductoModa;
import portal.entities.ProductoMueble;
import portal.vo.ItemVO;
import portal.vo.ProductoVO;

/**
 * Session Bean implementation class AdministradorUsuariosBean
 */
@Stateless
public class AdministradorProductosBean implements AdministradorProductos {
	
	private static Logger logger = Logger.getLogger(AdministradorProductosBean.class);

	@PersistenceContext(unitName = "PortalDeComprasDB")
    EntityManager em;
	
    
    /**
     * Default constructor. 
     */
    public AdministradorProductosBean() {
        // TODO Auto-generated constructor stub
    }


	@Override
	public void agregarProducto(Producto producto) {
		em.persist(producto);
	}


	@SuppressWarnings("unchecked")
	@Override
	public List<ProductoVO> getListaProductos() {
		List<Producto> productos = new ArrayList<Producto>();
		
		Query query = em.createQuery("from Producto");
		productos = query.getResultList();	
		return convVo.getListaVoFromEntity(productos);
		
	}


	@Override
	public ProductoVO getProductoByCodigo(Long codigo) {		
		
		Query query = em.createQuery("from Producto p where p.codigo = :codigo");
		query.setParameter("codigo", codigo);
		try {
			Producto producto = (Producto) query.getSingleResult();
			return producto.getVO();
		} catch (NoResultException e) {
			logger.warn("No se obtuvo el producto con codigo " + codigo);
			return null;
		}
		

	}


	@Override
	public ProductoVO getProductoById(Long idProducto) {
		Producto producto = em.find(Producto.class, idProducto);
		return producto.getVO();
	}


	@Override
	public List<ProductoVO> getListaProductosByCategoria(String categoria) {
		
		List<Producto> productos = new ArrayList<Producto>();
		
		Query query = em.createQuery("from Producto p where p.class = :categoria");
		query.setParameter("categoria", categoria);
		productos = query.getResultList();
		return convVo.getListaVoFromEntity(productos);
	}


	@Override
	public List<ProductoVO> getListaProductosByNombre(String nombre) {
		List<Producto> productos = new ArrayList<Producto>();
		
		Query query = em.createQuery("from Producto p where upper(p.nombre) like upper(:nombre)");
		query.setParameter("nombre", "%" + nombre + "%");
		productos = query.getResultList();
		return convVo.getListaVoFromEntity(productos);
	}


	@Override
	public void actualizarRankingProductos(List<Ranking> listaRanking) {
		Ranking rank = null;
		Iterator<Ranking> iter = listaRanking.iterator();
		
		while (iter.hasNext()) {
			rank = (Ranking) iter.next();
			//Producto producto = em.find(Producto.class, rank.getCodigoArticulo());
			Query query = em.createQuery("from Producto p where p.codigo = :codigo");
			query.setParameter("codigo", rank.getCodigoArticulo());
			Producto producto = null;
			try {
				producto = (Producto) query.getSingleResult();
				
			} catch (NoResultException e) {
				logger.warn("No se obtuvo el producto con codigo " + rank.getCodigoArticulo());
			}
			if(producto != null) {
				producto.setRanking(rank.getPosicion());
			}
		}
		
		
	}


	
    
}
